package com.sky.controller.admin;

import com.sky.constant.StatusConstant;
import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;

import com.sky.vo.DishVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;

@RestController
@RequestMapping("/admin/dish")
@Slf4j
public class DishController {

    //引入redis数据库使用对象
    @Autowired
    public RedisTemplate redisTemplate;

    @Autowired
    private DishService dishService;

    /**
     * 新增菜品的方法
     * @param dto
     * @return
     */
    @PostMapping()
    public Result save(@RequestBody DishDTO dto){
        log.info("保存菜品的参数为:{}",dto);
        //新增菜品要清除redis中的缓存数据  知道categoryId可以精准删除key
        Long categoryId = dto.getCategoryId();
        String key = "dish_" + categoryId;
        deleteRedis(key);
        //再调用新增方法  新增到数据库中去
        dishService.save(dto);
        return Result.success();
    }

    /**
     * 分页查询菜品
     * @return
     */
    @GetMapping("/page")
    public Result<PageResult> queryPage(DishPageQueryDTO dto){
        log.info("分页查询接收到的数据为:{}",dto);
       PageResult pageResult =  dishService.queryPage(dto);
        return Result.success(pageResult);
    }

    /**
     * 根据菜品id批量删除菜品
     * @param ids
     * @return
     */
    @DeleteMapping
    public Result deleteById(@RequestParam List<Long> ids){
        log.info("接收到的批量删除的菜品id为:{}",ids);
        //批量删除数据库里面的数据之前 要先清理redis缓存 不知道具体的key 删除所有的key及value值
        /*Set keys = redisTemplate.keys("*");
        redisTemplate.delete(keys);*/
        deleteRedis("dish_*");
        //删除后再调用数据库
        dishService.deleteById(ids);
        return Result.success();
    }

    /**
     * 根据分类id查询所有菜品
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    public Result<List<DishVO>> getByCategoryIdList(Long categoryId){
        log.info("前端传递过来的分类id为:{}",categoryId);
        Dish dish =  new Dish();
        dish.setCategoryId(categoryId);
        //查询在售货的菜品
        //dish.setStatus(StatusConstant.ENABLE);
       List<DishVO> dishVOList = dishService.getAdminByCategoryIdList(dish);
       log.info("根据分类id条件查询到的所属菜品集合为:{}",dishVOList);
        return Result.success(dishVOList);
    }

    /**
     * 根据菜品id查找菜品数据及所属口味数据
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public Result<DishVO> getById(@PathVariable Long id){
        log.info("前端传过来的菜品id为:{}",id);
        DishVO dishVO =  dishService.getById(id);
        return Result.success(dishVO);
    }

    /**
     * 修改菜品
     * @param dto
     * @return
     */
    @PutMapping
    public Result update(@RequestBody DishDTO dto){
        log.info("接收到的前端传回的要修改菜品数据为:{}",dto);
        //修改菜品之前先清理redis中的缓存记录 全部key和value都要删除
        /*Set keys = redisTemplate.keys("*");
        redisTemplate.delete(keys);*/
        deleteRedis("dish_*");
        //删除玩redis中缓存后 再继续修改sql数据库
        dishService.update(dto);
        return Result.success();
    }

    /**
     * 设置菜品的出售状态
     * @param status
     * @return
     */
    @PostMapping("/status/{status}")
    public Result setStatus(@PathVariable Integer status,Long id){
        //修改菜品之前先清理redis中的缓存记录 全部key和value都要删除
        /*Set keys = redisTemplate.keys("*");
        redisTemplate.delete(keys);*/
        deleteRedis("dish_*");
        log.info("前端传过来的菜品状态为:{}{}",status,id);
        dishService.updateStatus(status,id);
        return Result.success();
    }

    private void deleteRedis(String pattern){
        Set keys = redisTemplate.keys(pattern);
        redisTemplate.delete(keys);
    }
}
